package cn.i7baozh.consumer.service;

import cn.i7baozh.api.entities.CommonResult;
import cn.i7baozh.consumer.config.ApplicationContextConfig;
import cn.i7baozh.consumer.service.fallback.PaymentFeignFallbackFactoryImpl;
import cn.i7baozh.consumer.service.fallback.PaymentFeignServiceFallBackImpl;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.FeignClientsConfiguration;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author : baoqi.zhang
 * @date :   2022/4/8 11:24
 */
@Component
/**
 * 引用多个相同的value值的服务时必须填写contextId
 *
 * fallback 或 fallbackFactory 必须配合使用 HystrixFeign使用
 * 开启HystrixFeign两种方式
 * 1. 在代码中配置HystrixFeign
 * @see ApplicationContextConfig#getFeignBuilder()
 * 2. 在配置文件中，设置 feign.hystrix.enabled=true 实际上与第一种方式是一样的 ，源代码如下
 * @see FeignClientsConfiguration.HystrixFeignConfiguration
 *
 * 如果同时使用 fallback 和 fallbackFactory
 * 优先级 fallback > fallbackFactory
 *
 *
 */
@FeignClient(value = "consul-provider-payment", contextId = "b"
//        , fallbackFactory = PaymentFeignFallbackFactoryImpl.class
        , fallback = PaymentFeignServiceFallBackImpl.class
)
public interface PaymentFeignService {

    //两个坑 1. GetMapping不支持 2。 @PathVariable必须设置value
    @RequestMapping("/payment/consul1")
    String getPaymentInfo();

    @RequestMapping("/payment/abc")
    CommonResult<String> abc();

    @RequestMapping("/payment/timeout")
    String paymentTimeout();
}
